#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ОтборПоХранилищамНастроек.Добавить("ХранилищеНастроекДанныхФорм", НСтр("ru = 'Хранилище настроек данных форм'"));
	ОтборПоХранилищамНастроек.Добавить("ХранилищеОбщихНастроек", НСтр("ru = 'Хранилище общих настроек'"));
	ОтборПоХранилищамНастроек.Добавить("ХранилищеПользовательскихНастроекДинамическихСписков", НСтр(
		"ru = 'Хранилище пользовательских настроек динамических списков'"));
	ОтборПоХранилищамНастроек.Добавить("ХранилищеПользовательскихНастроекОтчетов", НСтр(
		"ru = 'Хранилище пользовательских настроек отчетов'"));
	ОтборПоХранилищамНастроек.Добавить("ХранилищеСистемныхНастроек", НСтр("ru = 'Хранилище системных настроек'"));

	ОбновитьТаблицуПользователей();
	
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
		
	// Начальное заполнение дерева настроек
	ОбновитьНастройкиВладельца(Неопределено);
	
	// Управление внешним видом формы
	ОбновитьОтображениеЭлементов();

	Элементы.ТаблицаВыбранныхНастроек.ОтборСтрок = Новый ФиксированнаяСтруктура("Пометка", Истина);

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьНастройкиВладельца(Команда)

	ОбновитьНастройкиВладельцаНаСервере();

	Элементы.ДеревоКонфигурации.Развернуть(
		ДеревоКонфигурации.ПолучитьЭлементы()[0].ПолучитьИдентификатор());

КонецПроцедуры

&НаКлиенте
Процедура ВариантПредставленияОбъектовКонфигурацииПриИзменении(Элемент)

	ОбновитьОтображениеЭлементов(Элемент.Имя);

	ОбновитьНастройкиВладельца(Неопределено);

КонецПроцедуры

&НаКлиенте
Процедура ДеревоКонфигурацииПометкаПриИзменении(Элемент)

	ТекДанные = Элементы.ДеревоКонфигурации.ТекущиеДанные;
	УправлениеПометками(ТекДанные);

КонецПроцедуры

&НаКлиенте
Процедура ДеревоКонфигурацииПриАктивизацииСтроки(Элемент)

	ТекДанные = Элементы.ДеревоКонфигурации.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Элементы.ТаблицаНастроек.ОтборСтрок = ?(ТекДанные.ИдентификаторОтбора = 0, Неопределено,
		Новый ФиксированнаяСтруктура("ИдентификаторОтбора" + ТекДанные.Уровень, ТекДанные.ИдентификаторОтбора));

КонецПроцедуры

&НаКлиенте
Процедура ОтменитьВыборНастройки(Команда)

	Для Каждого ВыделеннаяСтрока Из Элементы.ТаблицаВыбранныхНастроек.ВыделенныеСтроки Цикл

		Строка = ТаблицаНастроек.НайтиПоИдентификатору(ВыделеннаяСтрока);
		Если Строка <> Неопределено Тогда
			Строка.Пометка = Ложь;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаНастроекПометкаПриИзменении(Элемент)

	СтрокаДерева = Элементы.ДеревоКонфигурации.ТекущиеДанные;
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("ИдентификаторОтбора" + СтрокаДерева.Уровень, СтрокаДерева.ИдентификаторОтбора);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(ПараметрыОтбора);
	Если НайденныеСтроки <> Неопределено Тогда
		ВсегоНастроек = НайденныеСтроки.Количество();
	КонецЕсли;

	ПараметрыОтбора.Вставить("Пометка", Истина);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(ПараметрыОтбора);
	Если НайденныеСтроки <> Неопределено Тогда
		КолПометок = НайденныеСтроки.Количество();
	КонецЕсли;

	Если КолПометок = 0 Тогда
		СтрокаДерева.Пометка = 0;
	ИначеЕсли КолПометок <> ВсегоНастроек Тогда
		СтрокаДерева.Пометка = 2;
	Иначе
		СтрокаДерева.Пометка = 1;
	КонецЕсли;

	УправлениеПометками(СтрокаДерева, Ложь);

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаНастроекНастройкиОткрытие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	ТекДанные = Элементы.ТаблицаНастроек.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПросмотрНастроекНаСервере(ТекДанные.ИмяХранилищаНастроек, ТекДанные.КлючОбъекта, ТекДанные.КлючНастроек,
		ВладелецНастроек);

КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВыбранныеНастройки(Команда)
	Элементы.ДеревоКонфигурацииПоказатьВыбранныеНастройки.Пометка = Не Элементы.ДеревоКонфигурацииПоказатьВыбранныеНастройки.Пометка;
	ОбновитьОтображениеЭлементов("ПоказатьВыбранныеНастройки");
КонецПроцедуры

&НаКлиенте
Процедура ВладелецНастроекПриИзменении(Элемент)
	ОбновитьНастройкиВладельца(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура ВладелецНастроекОчистка(Элемент, СтандартнаяОбработка)
	ОбновитьНастройкиВладельца(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВыбранныхПользователей(Команда)
	Элементы.ТаблицаПользователиПоказатьВыбранныхПользователей.Пометка = Не Элементы.ТаблицаПользователиПоказатьВыбранныхПользователей.Пометка;
	ОбновитьОтображениеЭлементов("ПоказатьВыбранныхПользователей");
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПользователиПометкаПриИзменении(Элемент)

	ТекДанные = Элементы.Пользователи.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекДанные.Пометка Тогда
		ТекДанные.Пометка = Ложь;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьВыбранныеНастройки(Команда)
	
	// Проверки
	ЕстьОшибка = Ложь;
	Отбор = Новый Структура("Пометка", Истина);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() = 0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не выбраны настройки для удаления'"), , , ,
			ЕстьОшибка);
	КонецЕсли;

	Если ЕстьОшибка Тогда
		Возврат;
	КонецЕсли;

	ПоказатьВопрос(
		Новый ОписаниеОповещения("ВопросУдалитьНастройкиЗавершение", ЭтаФорма), СтрШаблон(НСтр(
		"ru = 'Удалить выбранные настройки у пользователя %1?'"), ВладелецНастроек), РежимДиалогаВопрос.ДаНет, ,
		КодВозвратаДиалога.Нет, НСтр("ru = 'Внимание!'"));

КонецПроцедуры

&НаКлиенте
Процедура СкопироватьВыбранныеНастройки(Команда)
	
	// Проверки
	ЕстьОшибка = Ложь;
	Отбор = Новый Структура("Пометка", Истина);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() = 0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не выбраны настройки для копирования'"), , , ,
			ЕстьОшибка);
	КонецЕсли;
	НайденныеСтроки = Пользователи.НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() = 0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не указаны пользователи (кому копировать)'"),
			, , , ЕстьОшибка);
	КонецЕсли;

	Если ЕстьОшибка Тогда
		Возврат;
	КонецЕсли;

	ПоказатьВопрос(
		Новый ОписаниеОповещения("ВопросСкопироватьНастройкиЗавершение", ЭтаФорма), НСтр(
		"ru = 'Скопировать выбранные настройки выбранным пользователям?'"), РежимДиалогаВопрос.ДаНет, ,
		КодВозвратаДиалога.Нет, НСтр("ru = 'Внимание!'"));

КонецПроцедуры

&НаКлиенте
Процедура ТекстОтбораПоХранилищамНастроекНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОтборПоХранилищамНастроек.ПоказатьОтметкуЭлементов(
		Новый ОписаниеОповещения("ИзменениеОтбораПоХранилищамНастроекЗавершение", ЭтаФорма));
КонецПроцедуры

&НаКлиенте
Процедура ТекстОтбораПоХранилищамНастроекОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ТекстОтбораПоХранилищамНастроек = "";
	ОтборПоХранилищамНастроек.ЗаполнитьПометки(Ложь);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры



#КонецОбласти

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработкиЗавершения

&НаКлиенте
Процедура ВопросУдалитьНастройкиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	УдалитьВыбранныеНастройкиНаСервере();

	ОбновитьНастройкиВладельца(Неопределено);

КонецПроцедуры

&НаКлиенте
Процедура ВопросСкопироватьНастройкиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	СкопироватьВыбранныеНастройкиНаСервере();

	ПоказатьПредупреждение( , НСтр("ru = 'Копирование настроек выполнено'"));

КонецПроцедуры

&НаКлиенте
Процедура ИзменениеОтбораПоХранилищамНастроекЗавершение(Список, ДополнительныеПараметры) Экспорт

	Если Список = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекстОтбораПоХранилищамНастроек = "";
	Для Каждого ЭлементСписка Из Список Цикл
		Если ЭлементСписка.Пометка Тогда
			ТекстОтбораПоХранилищамНастроек = ТекстОтбораПоХранилищамНастроек + ?(ТекстОтбораПоХранилищамНастроек = "",
				"", "; ") + ЭлементСписка.Представление;
		КонецЕсли;
	КонецЦикла;

	ОбновитьНастройкиВладельца(Неопределено);

КонецПроцедуры

#КонецОбласти

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ОбновитьТаблицуПользователей()

	Пользователи.Очистить();

	ПользователиИБ=ПользователиИнформационнойБазы.ПолучитьПользователей();
	Для Каждого ПользовательИБ Из ПользователиИБ Цикл
		НС=Пользователи.Добавить();
		НС.Имя=ПользовательИБ.Имя;
		НС.ПолноеИмя=ПользовательИБ.ПолноеИмя;
		НС.Картинка=0;
		НС.УникальныйИдентификатор=ПользовательИБ.УникальныйИдентификатор;

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьОтображениеЭлементов(ЭлементыУправления = Неопределено)

	// Подготовить массив имен ЭУ, отображение которых надо обновить
	МассивЭУ = Новый Массив;
	Если ТипЗнч(ЭлементыУправления) = Тип("Строка") Тогда
		МассивЭУ = СтрРазделить(ЭлементыУправления, ",");
	КонецЕсли;

	Если МассивЭУ.Количество() = 0 Или МассивЭУ.Найти("ВариантПредставленияОбъектовКонфигурации") <> Неопределено Тогда
		Элементы.ДеревоКонфигурацииПоИмени.Видимость = (ВариантПредставленияОбъектовКонфигурации = 0);
		Элементы.ДеревоКонфигурацииПоСинониму.Видимость = (ВариантПредставленияОбъектовКонфигурации = 1);
	КонецЕсли;

	Если МассивЭУ.Количество() = 0 Или МассивЭУ.Найти("ПоказатьВыбранныеНастройки") <> Неопределено Тогда
		Элементы.ГруппаВыбранныеНастройки.Видимость = Элементы.ДеревоКонфигурацииПоказатьВыбранныеНастройки.Пометка;
		Элементы.ДеревоКонфигурацииПоказатьВыбранныеНастройки.Заголовок = ?(Элементы.ГруппаВыбранныеНастройки.Видимость,
			НСтр("ru = 'Скрыть выбранные настройки'"), НСтр("ru = 'Показать выбранные настройки'"));
	КонецЕсли;

	Если МассивЭУ.Количество() = 0 Или МассивЭУ.Найти("ПоказатьВыбранныхПользователей") <> Неопределено Тогда
		Элементы.Пользователи.ОтборСтрок = ?(Элементы.ТаблицаПользователиПоказатьВыбранныхПользователей.Пометка,
			Новый ФиксированнаяСтруктура("Пометка", Истина), Неопределено);
		Элементы.ТаблицаПользователиПоказатьВыбранныхПользователей.Заголовок = ?(
			Элементы.Пользователи.ОтборСтрок <> Неопределено, НСтр("ru = 'Показать всех'"), НСтр(
			"ru = 'Показать выбранных'"));
	КонецЕсли;	
	
	//Если МассивЭУ.Количество() = 0 Тогда
	// В условии описываюся свойства элементов,
	// которые обновляются независимо от переданного параметра ЭлементыУправления
	//КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ОбновитьНастройкиВладельцаНаСервере()

	// Инициализитовать дерево конфигурации и очистить его
	ДЗ = РеквизитФормыВЗначение("ДеревоКонфигурации");
	ДЗ.Строки.Очистить();
	// Инициализитовать таблицу настроек и очистить его
	ТЗ = РеквизитФормыВЗначение("ТаблицаНастроек");
	ТЗ.Очистить();
	
	// Создать строку для корня конфигурации
	СтрокаДереваКонфигурация = ДЗ.Строки.Добавить();
	СтрокаДереваКонфигурация.ПредставлениеИмя = Метаданные.Имя + НСтр("ru = ' (Все настройки)'");
	СтрокаДереваКонфигурация.ПредставлениеСиноним = Метаданные.Синоним + НСтр("ru = ' (Все настройки)'");
	СтрокаДереваКонфигурация.Порядок = 0;
	//СтрокаДереваКонфигурация.Картинка = 0;
	СтрокаДереваПрочее = СтрокаДереваКонфигурация.Строки.Добавить();
	СтрокаДереваПрочее.ПредставлениеИмя = НСтр("ru = 'Прочее'");
	СтрокаДереваПрочее.ПредставлениеСиноним = СтрокаДереваПрочее.ПредставлениеИмя;
	СтрокаДереваПрочее.Порядок = 900;
	СтрокаДереваПрочее.Путь = "Прочее";
	СтрокаДереваПрочее.ИдентификаторОтбора = 1;
	//СтрокаДереваПрочее.Картинка = 0;
	
	// Параметры для создания веток дерева
	ДополнительныеПараметры = ИнициализироватьПараметрыДляСозданияДереваКонфигурации(ТЗ);
	ДополнительныеПараметры.Вставить("СтрокаДереваКонфигурация", СтрокаДереваКонфигурация);
	ДополнительныеПараметры.Вставить("СтрокаДереваПрочее", СтрокаДереваПрочее);
	
	// Получить настроки пользователя
	Отбор = Новый Структура("Пользователь", ВладелецНастроек);
	Для Каждого ЭлементСписка Из ОтборПоХранилищамНастроек Цикл
		Если ЭлементСписка.Пометка Или ПустаяСтрока(ТекстОтбораПоХранилищамНастроек) Тогда

			ИмяХранилищаНастроек = ЭлементСписка.Значение;
			Выборка = Вычислить(ИмяХранилищаНастроек).Выбрать(Отбор);
			ДополнительныеПараметры.ИмяХранилищаНастроек = ИмяХранилищаНастроек;
				
				// Заполнение дерева
			ДополнитьДеревоНастроек(Выборка, ИмяХранилищаНастроек, ДополнительныеПараметры);

		КонецЕсли;
	КонецЦикла; 
		
	// Отправить значения на форму
	ЗначениеВРеквизитФормы(ДЗ, "ДеревоКонфигурации");
	ЗначениеВРеквизитФормы(ДополнительныеПараметры.ТаблицаЗначенийНастроек, "ТаблицаНастроек");

КонецПроцедуры

&НаСервере
Процедура ДополнитьДеревоНастроек(Выборка, ИмяХранилищаНастроек, ДополнительныеПараметры)

	СтрокаДереваКонфигурация = ДополнительныеПараметры.СтрокаДереваКонфигурация;
	СтрокаДереваПрочее = ДополнительныеПараметры.СтрокаДереваПрочее;
	
	// Цикл по настройкам пользователя
	Пока Выборка.Следующий() Цикл
		
		// Разложить КлючОбъекта в Массив(10)
		МассивКлюч = СтрРазделить(Выборка.КлючОбъекта, "/", Истина);
		КоличествоЭлементовВМассиве = МассивКлюч.Количество();
		Для Ин = КоличествоЭлементовВМассиве По 9 Цикл
			МассивКлюч.Добавить("");
		КонецЦикла;
		
		// Разложить Ключ объекта настроек в Массив(10)
		ПутьОбъектаКонфигурации = ?(МассивКлюч[0] = "Общее" И МассивКлюч[1] = "ИсторияПоискаТаблицы", МассивКлюч[2],
			МассивКлюч[0]);
		МассивПуть = СтрРазделить(ПутьОбъектаКонфигурации, ".", Истина);
		КоличествоЭлементовВМассиве = МассивПуть.Количество();
		Для Ин = КоличествоЭлементовВМассиве По 9 Цикл
			МассивПуть.Добавить("");
		КонецЦикла;
		
		// Запуск рекурсивного создания строк дерева настроек
		ДополнительныеПараметры.Вставить("СтрокаДереваКонфигурация", СтрокаДереваКонфигурация);
		ДополнительныеПараметры.Вставить("МассивПуть", МассивПуть);
		ДополнительныеПараметры.Вставить("ВыборкаНастроек", Выборка);
		ПроверяемоеСвойство = СтрЗаменить(МассивПуть[0], " ", "");
		Попытка
			Если ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Свойство(ПроверяемоеСвойство) Тогда
				СоздатьВеткуКонфигурации(СтрокаДереваКонфигурация, ДополнительныеПараметры);
			Иначе
				СоздатьВеткуКонфигурации(СтрокаДереваПрочее, ДополнительныеПараметры);
			КонецЕсли;
		Исключение
		КонецПопытки;
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ИнициализироватьПараметрыДляСозданияДереваКонфигурации(ТаблицаЗначенийНастроек)

	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ИмяХранилищаНастроек", "");
	ДополнительныеПараметры.Вставить("ТаблицаЗначенийНастроек", ТаблицаЗначенийНастроек);
	ДополнительныеПараметры.Вставить("НомерКартинки", 0);
	ДополнительныеПараметры.Вставить("СчетчикИдентификаторовОтбора", 2);
	ДополнительныеПараметры.Вставить("ПредопределенныеВеткиКонфигурации", Новый Структура);
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Общие", "Общие");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Подсистема", "Подсистема");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ХранилищеНастроек", "ХранилищеНастроек");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ПланОбмена", "ПланОбмена");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ОбщаяФорма", "ОбщаяФорма");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Константа", "Константа");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Справочник", "Справочник");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Документ", "Документ");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ЖурналДокументов", "ЖурналДокументов");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Перечисление", "Перечисление");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Отчет", "Отчет");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ВнешнийОтчет", "ВнешнийОтчет");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Обработка", "Обработка");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ВнешняяОбработка", "ВнешняяОбработка");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ПланВидовХарактеристик",
		"ПланВидовХарактеристик");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ПланСчетов", "ПланСчетов");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ПланВидовРасчета", "ПланВидовРасчета");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("РегистрСведений", "РегистрСведений");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("РегистрНакопления", "РегистрНакопления");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("РегистрБухгалтерии", "РегистрБухгалтерии");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("РегистрРасчета", "РегистрРасчета");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("БизнесПроцесс", "БизнесПроцесс");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("Задача", "Задача");
	ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Вставить("ВнешнийИсточникДанных", "ВнешнийИсточникДанных");

	Возврат ДополнительныеПараметры;

КонецФункции

&НаСервере
Процедура СоздатьВеткуКонфигурации(СтрокаРодитель, ДополнительныеПараметры, Уровень = 0)
	
	// Дополнить "Путь" настройки, чтобы дерево было похоже на дерево конфигурации в конфигураторе 1С
	Если Уровень = 0 И (ДополнительныеПараметры.МассивПуть[Уровень] = "ОбщаяФорма"
		Или ДополнительныеПараметры.МассивПуть[Уровень] = "ХранилищеНастроек"
		Или ДополнительныеПараметры.МассивПуть[Уровень] = "ПланОбмена" Или ДополнительныеПараметры.МассивПуть[Уровень]
		= "Подсистема") Тогда
		ДополнительныеПараметры.МассивПуть.Вставить(0, "Общие");
	КонецЕсли; 
	
	// ПутьПоиска, нужен для того, чтобы не дублировалить ветки дерева настроек
	ПутьПоиска = ?(Уровень = 0, "", СтрокаРодитель.Путь + ".") + ДополнительныеПараметры.МассивПуть[Уровень];
	
	// Найти существующую ветку
	СтрокаДерева = СтрокаРодитель.Строки.Найти(ПутьПоиска, "Путь", Ложь);
	Если СтрокаДерева = Неопределено Тогда		
		
		// Не нашли. Создать новую ветку
		СтрокаДерева = СтрокаРодитель.Строки.Добавить();
		СтрокаДерева.Путь = ПутьПоиска;
		СтрокаДерева.Уровень = Уровень;
		СтрокаДерева.ИдентификаторОтбора = ДополнительныеПараметры.СчетчикИдентификаторовОтбора;
		ДополнительныеПараметры.СчетчикИдентификаторовОтбора = ДополнительныеПараметры.СчетчикИдентификаторовОтбора + 1;
		// Заполнить колонки строки дерева
		ЗаполнитьСтрокуДереваКонфигурации(СтрокаДерева, ДополнительныеПараметры, Уровень);

	КонецЕсли;

	Если ДополнительныеПараметры.МассивПуть[Уровень + 1] <> "" И Уровень < 3 Тогда
		// Рекурсия
		СоздатьВеткуКонфигурации(СтрокаДерева, ДополнительныеПараметры, Уровень + 1);

	Иначе
		// Добавить строку в таблицу настроек текущей строки дерева
		СтрокаТаблицыНастроек = ДополнительныеПараметры.ТаблицаЗначенийНастроек.Добавить();
		СтрокаТаблицыНастроек.ИмяХранилищаНастроек = ДополнительныеПараметры.ИмяХранилищаНастроек;
		СтрокаТаблицыНастроек.НастройкиПр = ДополнительныеПараметры.ВыборкаНастроек.Настройки;
		ЗаполнитьЗначенияСвойств(СтрокаТаблицыНастроек, ДополнительныеПараметры.ВыборкаНастроек);
		УстановитьИдентификаторОтбора(СтрокаТаблицыНастроек, СтрокаДерева);

	КонецЕсли; 
		
	// Сортировка уровня дерева взависимости от варианта отображения представления. Либо по имени, либо по синониму
	СтрокаРодитель.Строки.Сортировать(
		?(ВариантПредставленияОбъектовКонфигурации = 0, "Порядок, ПредставлениеИмя", "Порядок, ПредставлениеСиноним"));

КонецПроцедуры

&НаСервере
Функция ЗаполнитьСтрокуДереваКонфигурации(СтрокаДерева, ДополнительныеПараметры, Индекс)
	
	// Значения по умолчанию
	СтрокаДерева.ПредставлениеИмя = ДополнительныеПараметры.МассивПуть[Индекс];
	СтрокаДерева.ПредставлениеСиноним = ДополнительныеПараметры.МассивПуть[Индекс];
	СтрокаДерева.Порядок = 999;

	Если ДополнительныеПараметры.МассивПуть[Индекс] = ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Общие Тогда
		СтрокаДерева.ПредставлениеИмя = "Общие";
		СтрокаДерева.Порядок = 10;
		//СтрокаДерева.Картинка = 0;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Подсистема Тогда
		СтрокаДерева.ПредставлениеИмя = "Подсистемы";
		СтрокаДерева.ПредставлениеСиноним = "Подсистемы";
		СтрокаДерева.КлассОбъектовМетаданных = "Подсистема";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 20;
		//СтрокаДерева.Картинка = 0;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ХранилищеНастроек Тогда
		СтрокаДерева.ПредставлениеИмя = "Хранилища настроек";
		СтрокаДерева.ПредставлениеСиноним = "Хранилища настроек";
		СтрокаДерева.КлассОбъектовМетаданных = "ХранилищеНастроек";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 21;
		//СтрокаДерева.Картинка = 0;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ПланОбмена Тогда
		СтрокаДерева.ПредставлениеИмя = "Планы обмена";
		СтрокаДерева.ПредставлениеСиноним = "Планы обмена";
		СтрокаДерева.КлассОбъектовМетаданных = "ПланОбмена";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 22;
		//СтрокаДерева.Картинка = 0;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ОбщаяФорма Тогда
		СтрокаДерева.ПредставлениеИмя = "Общие формы";
		СтрокаДерева.ПредставлениеСиноним = "Общие формы";
		СтрокаДерева.КлассОбъектовМетаданных = "ОбщаяФорма";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 23;
		СтрокаДерева.Картинка = 1;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Константа Тогда
		СтрокаДерева.ПредставлениеИмя = "Константы";
		СтрокаДерева.ПредставлениеСиноним = "Константы";
		СтрокаДерева.КлассОбъектовМетаданных = "Константа";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 30;
		//СтрокаДерева.Картинка = 0;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Справочник Тогда
		СтрокаДерева.ПредставлениеИмя = "Справочники";
		СтрокаДерева.ПредставлениеСиноним = "Справочники";
		СтрокаДерева.КлассОбъектовМетаданных = "Справочник";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 31;
		СтрокаДерева.Картинка = 2;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Документ Тогда
		СтрокаДерева.ПредставлениеИмя = "Документы";
		СтрокаДерева.ПредставлениеСиноним = "Документы";
		СтрокаДерева.КлассОбъектовМетаданных = "Документ";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 32;
		СтрокаДерева.Картинка = 3;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ЖурналДокументов Тогда
		СтрокаДерева.ПредставлениеИмя = "Журналы документов";
		СтрокаДерева.ПредставлениеСиноним = "Журналы документов";
		СтрокаДерева.КлассОбъектовМетаданных = "ЖурналДокументов";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 33;
		СтрокаДерева.Картинка = 4;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Перечисление Тогда
		СтрокаДерева.ПредставлениеИмя = "Перечисления";
		СтрокаДерева.ПредставлениеСиноним = "Перечисления";
		СтрокаДерева.КлассОбъектовМетаданных = "Перечисление";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 34;
		//СтрокаДерева.Картинка = 3;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Отчет Тогда
		СтрокаДерева.ПредставлениеИмя = "Отчеты";
		СтрокаДерева.ПредставлениеСиноним = "Отчеты";
		СтрокаДерева.КлассОбъектовМетаданных = "Отчет";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 35;
		СтрокаДерева.Картинка = 5;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ВнешнийОтчет Тогда
		СтрокаДерева.ПредставлениеИмя = "ВнешниеОтчеты";
		СтрокаДерева.ПредставлениеСиноним = "ВнешниеОтчеты";
		СтрокаДерева.Порядок = 36;
		СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Обработка Тогда
		СтрокаДерева.ПредставлениеИмя = "Обработки";
		СтрокаДерева.ПредставлениеСиноним = "Обработки";
		СтрокаДерева.КлассОбъектовМетаданных = "Обработка";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 37;
		СтрокаДерева.Картинка = 7;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ВнешняяОбработка Тогда
		СтрокаДерева.ПредставлениеИмя = "ВнешниеОбработки";
		СтрокаДерева.ПредставлениеСиноним = "ВнешниеОбработки";
		СтрокаДерева.Порядок = 38;
		СтрокаДерева.Картинка = 8;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ПланВидовХарактеристик Тогда
		СтрокаДерева.ПредставлениеИмя = "Планы видов характеристик";
		СтрокаДерева.ПредставлениеСиноним = "Планы видов характеристик";
		СтрокаДерева.КлассОбъектовМетаданных = "ПланВидовХарактеристик";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 39;
		СтрокаДерева.Картинка = 9;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ПланСчетов Тогда
		СтрокаДерева.ПредставлениеИмя = "Планы счетов";
		СтрокаДерева.ПредставлениеСиноним = "Планы счетов";
		СтрокаДерева.КлассОбъектовМетаданных = "ПланСчетов";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 40;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ПланВидовРасчета Тогда
		СтрокаДерева.ПредставлениеИмя = "Планы видов расчета";
		СтрокаДерева.ПредставлениеСиноним = "Планы видов расчета";
		СтрокаДерева.КлассОбъектовМетаданных = "ПланВидовРасчета";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 41;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.РегистрСведений Тогда
		СтрокаДерева.ПредставлениеИмя = "Регистры сведений";
		СтрокаДерева.ПредставлениеСиноним = "Регистры сведений";
		СтрокаДерева.КлассОбъектовМетаданных = "РегистрСведений";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 42;
		СтрокаДерева.Картинка = 10;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.РегистрНакопления Тогда
		СтрокаДерева.ПредставлениеИмя = "Регистры накопления";
		СтрокаДерева.ПредставлениеСиноним = "Регистры накопления";
		СтрокаДерева.КлассОбъектовМетаданных = "РегистрНакопления";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 43;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.РегистрБухгалтерии Тогда
		СтрокаДерева.ПредставлениеИмя = "Регистры бухгалтерии";
		СтрокаДерева.ПредставлениеСиноним = "Регистры бухгалтерии";
		СтрокаДерева.КлассОбъектовМетаданных = "РегистрБухгалтерии";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 44;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.РегистрРасчета Тогда
		СтрокаДерева.ПредставлениеИмя = "Регистры расчета";
		СтрокаДерева.ПредставлениеСиноним = "Регистры расчета";
		СтрокаДерева.КлассОбъектовМетаданных = "РегистрРасчета";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 45;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.БизнесПроцесс Тогда
		СтрокаДерева.ПредставлениеИмя = "Бизнес-процессы";
		СтрокаДерева.ПредставлениеСиноним = "Бизнес-процессы";
		СтрокаДерева.КлассОбъектовМетаданных = "БизнесПроцесс";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 46;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.Задача Тогда
		СтрокаДерева.ПредставлениеИмя = "Задачи";
		СтрокаДерева.ПредставлениеСиноним = "Задачи";
		СтрокаДерева.КлассОбъектовМетаданных = "Задача";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 47;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс]
		= ДополнительныеПараметры.ПредопределенныеВеткиКонфигурации.ВнешнийИсточникДанных Тогда
		СтрокаДерева.ПредставлениеИмя = "Внешние источники данных";
		СтрокаДерева.ПредставлениеСиноним = "Внешние источники данных";
		СтрокаДерева.КлассОбъектовМетаданных = "ВнешнийИсточникДанных";
		СтрокаДерева.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных = Истина;
		СтрокаДерева.Порядок = 48;
		//СтрокаДерева.Картинка = 6;

	ИначеЕсли ДополнительныеПараметры.МассивПуть[Индекс] = "Форма" Тогда
		СтрокаДерева.ПредставлениеИмя = "Формы";
		СтрокаДерева.ПредставлениеСиноним = "Формы";
		СтрокаДерева.Картинка = 1;

	Иначе
		СтрокаДерева.Картинка = ДополнительныеПараметры.НомерКартинки;

	КонецЕсли;

	ДополнительныеПараметры.НомерКартинки = СтрокаДерева.Картинка;
	
	// Заполнение колонок дерева ПредставлениеСиноним, ОтсутствуетВКонфигурации
	Если Индекс > 0 И СтрокаДерева.Родитель.ФормироватьПредставлениеПодчиненныхСтрокИзСинонимаМетаданных Тогда
		ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(СтрокаДерева.Родитель.КлассОбъектовМетаданных + "."
			+ ДополнительныеПараметры.МассивПуть[Индекс]);
		Если ОбъектМетаданных = Неопределено Тогда
			СтрокаДерева.ОтсутствуетВКонфигурации = Истина;
			УстановитьОтсутствуетВКонфигурации(СтрокаДерева);
		Иначе
			СтрокаДерева.ПредставлениеСиноним = ОбъектМетаданных.Синоним;
		КонецЕсли;
	КонецЕсли;

КонецФункции

&НаСервере
Процедура УстановитьИдентификаторОтбора(СтрокаТаблицыНастроек, СтрокаДерева)

	СтрокаТаблицыНастроек["ИдентификаторОтбора" + СтрокаДерева.Уровень] = СтрокаДерева.ИдентификаторОтбора;

	СтрокаДерева.КоличествоНастроек = СтрокаДерева.КоличествоНастроек + 1;

	СтрокаРодитель = СтрокаДерева.Родитель;
	Если СтрокаРодитель.Родитель <> Неопределено Тогда
		// Рекурсия
		УстановитьИдентификаторОтбора(СтрокаТаблицыНастроек, СтрокаРодитель);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УстановитьОтсутствуетВКонфигурации(СтрокаДерева)

	СтрокаДерева.ОтсутствуетВКонфигурации = Истина;

	СтрокаРодитель = СтрокаДерева.Родитель;
	Если СтрокаРодитель.Родитель <> Неопределено Тогда
		// Рекурсия
		УстановитьОтсутствуетВКонфигурации(СтрокаРодитель);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УдалитьВыбранныеНастройкиНаСервере()
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Пометка", Истина);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(ПараметрыОтбора);
	Для Каждого Строка Из НайденныеСтроки Цикл
		ХрНастроек = Вычислить(Строка.ИмяХранилищаНастроек);
		ХрНастроек.Удалить(Строка.КлючОбъекта, Строка.КлючНастроек, ВладелецНастроек);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура СкопироватьВыбранныеНастройкиНаСервере()

	Отбор = Новый Структура("Пометка", Истина);

	ВыбранныеПользователи = Пользователи.НайтиСтроки(Отбор);

	ВыбранныеНастроки = ТаблицаНастроек.НайтиСтроки(Отбор);

	Для Каждого СтрокаПользователь Из ВыбранныеПользователи Цикл
		Для Каждого СтрокаНастройка Из ВыбранныеНастроки Цикл

			ХрНастроек = Вычислить(СтрокаНастройка.ИмяХранилищаНастроек);

			Отбор = Новый Структура;
			Отбор.Вставить("КлючОбъекта", СтрокаНастройка.КлючОбъекта);
			Отбор.Вставить("КлючНастроек", СтрокаНастройка.КлючНастроек);
			Отбор.Вставить("Пользователь", СтрокаПользователь.Имя);
			
			
			// Получить настроки для копирования. Выборка ВыборкаНастроекИсточника должен содержать один элемент
			ВыборкаНастроекИсточника = ХрНастроек.Выбрать(Отбор);
			ВыборкаНастроекИсточника.Следующий();
			
			// Скопировать настройки новому пользователю
			ХрНастроек.Сохранить(
				СтрокаНастройка.КлючОбъекта, СтрокаНастройка.КлючНастроек, ВыборкаНастроекИсточника.Настройки,
				СтрокаНастройка.Представление, СтрокаПользователь.Имя);

		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ПросмотрНастроекНаСервере(ИмяХранилищаНастроек, КлючОбъекта, КлючНастроек, ИмяПользователя)

	Отбор = Новый Структура;
	Отбор.Вставить("КлючОбъекта", КлючОбъекта);
	Отбор.Вставить("КлючНастроек", КлючНастроек);
	Отбор.Вставить("Пользователь", ИмяПользователя);

	Выборка = Вычислить(ИмяХранилищаНастроек).Выбрать(Отбор);
	Выборка.Следующий();

	СодержимоеНастроек = Выборка.Настройки;

КонецПроцедуры

#КонецОбласти

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

#Область Прочее

#Область Управление_пометками

&НаКлиенте
Процедура УстановитьПометкуПодчиненныхЭлементов(ЭлементДерева, Пометка)
	
	// Установить пометку
	ЭлементДерева.Пометка = Пометка;

	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("ИдентификаторОтбора" + ЭлементДерева.Уровень, ЭлементДерева.ИдентификаторОтбора);
	ПараметрыОтбора.Вставить("Пометка", Не Пометка);
	НайденныеСтроки = ТаблицаНастроек.НайтиСтроки(ПараметрыОтбора);
	Для Каждого Строка Из НайденныеСтроки Цикл
		Строка.Пометка = (Пометка = 1);
	КонецЦикла; 
	
	// Рекурсивная установка пометки у подчиненных строк дерева
	Для Каждого ПодчиненныйЭлемент Из ЭлементДерева.ПолучитьЭлементы() Цикл
		УстановитьПометкуПодчиненныхЭлементов(ПодчиненныйЭлемент, Пометка);
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкуРодительскихЭлементов(ЭлементДерева, Пометка)
	
	// Установить пометку
	ЭлементДерева.Пометка = Пометка;	
	
	// Рекурсивная установка пометки у родительских строк дерева
	ЭлементРодитель = ЭлементДерева.ПолучитьРодителя();
	Если Не ЭлементРодитель = Неопределено Тогда
		
		// Считаем количесвто помеченных элементов в подчиненном уровне
		КоличествоПомеченныхЭлеметов = 0;
		КоличествоСерыхЭлеметов = 0;
		ПодчиненныеЭлементыРодителя = ЭлементРодитель.ПолучитьЭлементы();
		Для Каждого ПодчиненныйЭлемент Из ПодчиненныеЭлементыРодителя Цикл
			КоличествоПомеченныхЭлеметов = КоличествоПомеченныхЭлеметов + ?(ПодчиненныйЭлемент.Пометка = 1, 1, 0);
			КоличествоСерыхЭлеметов = КоличествоСерыхЭлеметов + ?(ПодчиненныйЭлемент.Пометка = 2, 1, 0);
		КонецЦикла;
		
		// Устанавливаем пометки
		Если КоличествоПомеченныхЭлеметов = 0 И КоличествоСерыхЭлеметов = 0 Тогда
			УстановитьПометкуРодительскихЭлементов(ЭлементРодитель, 0);
		ИначеЕсли КоличествоПомеченныхЭлеметов = ПодчиненныеЭлементыРодителя.Количество() Тогда
			УстановитьПометкуРодительскихЭлементов(ЭлементРодитель, 1);
		Иначе
			УстановитьПометкуРодительскихЭлементов(ЭлементРодитель, 2);
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УправлениеПометками(ЭлементДерева, ОтсекатьСеруюПометку = Истина)

	Если ЭлементДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// отсечем серую пометку, считаем что сняли пометку
	Если ОтсекатьСеруюПометку И ЭлементДерева.Пометка = 2 Тогда
		ЭлементДерева.Пометка = 0;
	КонецЕсли;

	УстановитьПометкуПодчиненныхЭлементов(ЭлементДерева, ЭлементДерева.Пометка);
	УстановитьПометкуРодительскихЭлементов(ЭлементДерева, ЭлементДерева.Пометка);

КонецПроцедуры

#КонецОбласти

#КонецОбласти